<?php
namespace Admin\Controller;
use User\Api\UserApi;
 
class StudentController extends AdminController {
 	/**
 	 * 学生信息
 	 *
 	 * 		获取页面参数，获取session中学校数据，获取搜索框的班级列表，多表查询学生信息，处理学生学号。
 	 */
	public function index(){
 		$username       	=   I('username');
 		$classid       		=   I('classid');

 		$map['s.schoolid']	=	session('user_auth.schoolid');
 		$map['s.status']  	=	array('in','0,1');//学生状态:（-1：已删除，0：禁用，1：正常）
 		$map['s.isstudy']  	=   array('eq',1);//在读状态:（1表示在读，2表示毕业，3表示退学，默认为1）显示在读。

 		$studentClassModel 	=	M('Student s')->join('primary_class_info c ON s.classid = c.id','LEFT')//学生左连接班级表
 								->join('primary_ucenter_member u ON u.id=s.id','LEFT');/*通过学生id在ucMember中查询得到该学生的用户名*/
 		//搜索功能
 		if($classid){//如果参数存在班级id
 			if($classid=='-1'){//显示未分配班级的学生
 				$map['s.classid']	=	0;
 			}else{				//显示该班级的学生
 				$map['s.classid']	=	$classid;
 			}
 		}
 		$map['s.username|s.sno']    =   array('like', '%'.(string)$username.'%');
 		//获取搜索框的班级列表
 		$class				=	array(
 				'schoolid'		=>	session('user_auth.schoolid'),
 				'status'		=>	1,//班级状态（-1：已删除，0：禁用，1：正常）
 				'undergraduate'	=>	1,//是否毕业（1，表示未毕业，0表示已毕业）
 		);
 		$classList			=	M('ClassInfo')->where($class)->select();
 
 		//获取学生信息
 		$studentList		= 	$this->lists($studentClassModel, $map,'classid,s.id desc','s.*,c.class_name,u.username uc_username');
 		$this->assign('Class_list'	, $classList);
 		$this->assign('_list'		, $studentList);
 		Cookie('__forward__',$_SERVER['REQUEST_URI']);
 		$this->display();
 	}
 	
 	/**
 	 * 新建学生
 	 *
 	 * 		获取页面参数，处理学号，调用UserApi的方法注册用户，新建学生。
 	 */ 	
 	public function add(){
 		if(IS_POST){
 			$studentModel	=	D('Student');
 			$ucMemberModel  =   D('UcenterMember');
 			$student		=	M('Student')->create();//采集页面数据
 			if(!$student['sno']){//学号为空
 				$this->error('学号不能为空！');
 			} else {
	 			$user['username']=session('user_auth.school_short_name').$student['sno'];//处理学生用户名。
	 			$user=$ucMemberModel->create($user);//ucMember模型验证用户名是否符合注册要求。
	 			if (!$user) {//验证失败，提示验证错误。
	 				$this->error($ucMemberModel->getError());
	 			}else{//用户名验证成功
	 				$studentModel->startTrans();//开启事务
	 				$uid    =   $ucMemberModel->add($user);//ucMember添加用户
	 				resetPwd($uid);//设置用户密码（123456）
	 				/*补充修改页面数据*/
	 				$student['sno']			=	$user['username'];
	 				$student['status']		=	1;//学生状态:（-1：已删除，0：禁用，1：正常）
	 				$student['isstudy']		=	1;//在读状态:（1表示在读，2表示毕业，3表示退学，默认为1）
	 				$student['schoolid']	=	session('user_auth.schoolid');
	 				$student['schoolname']	=	session('user_auth.schoolname');
	 				$student=$studentModel->create($student);//学生模型验证数据是否符合添加要求。
	 				if (!$student){     // 如果创建失败 表示验证没有通过，回滚事务， 输出错误提示信息
	 					$studentModel->rollback();
	 					$this->error($studentModel->getError());
	 				}else{     // 数据验证通过
	 					/*补充数据*/
	 					$student['id'] = $uid;
	 					if(!$studentModel->add($student)){//添加学生失败则回滚事务， 输出错误提示信息
	 						$studentModel->rollback();
	 						$this->error($studentModel->getError());
	 					} else {
	 						$studentModel->commit();//添加学生成功则提交事务
							$this->success('学生添加成功！',Cookie('__forward__'));
	 					}
	 				}
	 			}
 			}
 		} else {
 			$this->display();
 		}
 	}
 	
 
 	/**
 	 * 编辑学生信息
 	 *
 	 *		获取页面参数，处理学号，修改student表中信息。
 	 *
 	 *		通过学生id查询出学生信息，处理学号，回显数据。
 	 */
 	public function detail(){
 		if(IS_POST){
 			$studentModel	=	D('Student');
 			$student		=	$studentModel->create();
 			if (!$student){     // 如果创建失败 表示验证没有通过 输出错误提示信息
 				$this->error($studentModel->getError());
 			}else{
 				$student['sno']	=	session('user_auth.school_short_name').$student['sno'];
 				$isexist    =   $studentModel->where(array('sno'=>$student['sno']))->find();
 				if(!$isexist){//在学生表中不存在该学号
 					$studentModel->save($student);
 					$this->success("修改成功！",Cookie('__forward__'));
 				} else {//存在该学号
 					if($isexist['id']==$student['id']){//修改信息
 						$studentModel->save($student);
 						$this->success("修改成功！",Cookie('__forward__'));
 					}
 					$this->error("学号已存在，修改失败！");
 				}
 				$studentModel->save($student);
 				$this->success("修改成功！",Cookie('__forward__'));
 			}
 		}else {
 			$studentId			=	I('id');
 			$studentClassModel 	=	M('Student s')->join('primary_class_info c ON s.classid = c.id','LEFT');//学生左连接班级表
 			$map['s.id']		=	$studentId;
 			$student			=	$studentClassModel->where($map)->field('s.*,c.class_name')->find();
			/*通过学生id在ucMember中查询得到该学生的用户名*/
 			$user=M('UcenterMember')->field('username')->find($studentId);
 			$student['uc_username']=$user['username'];
 			$this->assign('_list', $student);
 			$this->display();
 		}
 	}
 	

 	
 	/**
 	 * 修改状态
 	 * @param string $method	传入的修改状态命令
 	 *		drop			退学
 	 *		deletestudent	删除学生
 	 */
 	public function changeStatus($method=null){
 		$id = I('id');
 		$map['id'] =   $id;
 		$studentModel=M('Student');
 		$classModel=M('ClassInfo');
 		switch ( strtolower($method) ){
		//status 学生状态:（-1：已删除，0：禁用，1：正常）
		//isstudy在读状态:（1表示在读，2表示毕业，3表示退学，默认为1）显示在读。
 			
 			case 'drop'://退学
 				$data['isstudy']=3;
 				$class['id']    =	$studentModel->where($map)->getField('classid');
 				$studentCount	=	$classModel->where($class)->getField('studentcount');
 				$classSet['studentcount']=$studentCount-1;
 				$classModel->where($class)->save($classSet);
 				break;
//  			case 'graduate'://毕业
//  				$data['isstudy']=2;
//  				break;

			case 'resumestudent'://启用
				$this->resume('Student', $map);
				break;
			case 'forbidstudent'://禁用
				$this->forbid('Student', $map);
				break;
			case 'deletestudent'://删除
				$class['id']    =	$studentModel->where($map)->getField('classid');
				$studentCount	=	$classModel->where($class)->getField('studentcount');
				$classSet['studentcount']=$studentCount-1;
				$classModel->where($class)->save($classSet);
 				$this->delete('Student', $map);
 				break;
 				
 			default:
 				$this->error('参数非法');
 		}
 		if($data){
 			if(!$studentModel->where($map)->save($data)){
 				$this -> error('执行操作失败');
 			}else{
 				$this -> success('执行操作成功',Cookie('__forward__'));
 			}
 		}
 	}
 
 	/**
 	 * 重置密码
 	 * @param string $id	需要重置密码的用户id
 	 *
 	 * 		调用加密方法获取密文，修改数据。
 	 */
 	public function resetPassword($id=''){
 		if(!resetPwd($id)){
 			$this->error('重置密码失败！');
 		} else {
 			$this->success('重置密码（123456）成功！',Cookie('__forward__'));
 		}
 	}
 
 	private function getExcelValue($object,$row,$index){
 		$value = $object->getActiveSheet()->getCell($row.$index)->getValue();
 		if($value instanceof \PHPExcel_RichText){     //富文本转换字符串
 			$value = $value->__toString();
 		}
 		switch ($row) {
			case 'A':
			case 'B':
				$value	=	session('user_auth.school_short_name').$value;
				break;
			case 'E':
				$value	=	$value=='男'?0:1;
				break;
			case 'F':
				$time	=	($value-25569)*24*60*60; //获得秒数 25569是1970-01-01的时间
				$value	=	date('Y-m-d', $time);
				break;
 			default:
 				;
 			break;
 		}
 		$value=str_replace(array(' ','　'),array('',''), $value);
 		return $value;
 	}
 	/**
 	 * 导入学生信息
 	 *
 	 *		获取excel文件，处理学号，调用UserApi的方法注册用户，提取信息数据新建学生。
 	 */
 	public function impStudent(){
 		if (!empty($_FILES)) {
 			$config=array(
 					'allowExts'=>array('xlsx','xls'),
 					'savePath'=>'./Public/upload/',
 					'saveRule'=>'time',
 			);
 			$upload = new \Think\Upload($config);//3.1版本之前是UploadFile，所以这里修改下
 			$info = $upload->upload();
 			if (!$info) {
 				$this->error($upload->getError());
 			}
 			vendor("PHPExcel.PHPExcel");
 			$file_name='Uploads/'.$info['import']['savepath'].$info['import']['savename'];
//          $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
 			$objReader		=	\PHPExcel_IOFactory::createReader('Excel5');
 			$objPHPExcel	=	$objReader->load($file_name,$encode='utf-8');
 			$sheet			=	$objPHPExcel->getSheet(0);
 			$highestRow		=	$sheet->getHighestRow(); // 取得总行数
 			$highestColumn	=	$sheet->getHighestColumn(); // 取得总列数
 			$studentModel   =   D('Student');
 			$classModel     =   M('ClassInfo');
 			$ucMemberModel  =   D('UcenterMember');
 			$classModel->startTrans();//开启事务
 			for($i=4;$i<=$highestRow;$i++){
 				//获取学号，拼接成用户名，create验证。
 				$student['sno'] 	=   $this->getExcelValue($objPHPExcel,"A",$i);
 				$user['username']	=	$student['sno'];
 				$user=$ucMemberModel->create($user);
 				if (!$user) {//验证失败回滚事务，提示验证错误。
 					$classModel->rollback();
 					$this->error('第'.$i.'行：'.$ucMemberModel->getError(),'',30);
 				}else{//用户名验证成功，添加用户
 					$uid    =   $ucMemberModel->add($user);
 					if(!$uid){
 						$classModel->rollback();
 						$this->error('第'.$i.'行：添加失败！','',30);
 					}
 					//重置用户密码（123456）
 					resetPwd($uid);
 					//获取表格数据组成学生信息
 					$student['id']			=	$uid;
 					$student['schoolid']	=	session('user_auth.schoolid');
 					$student['schoolname']	=	session('user_auth.schoolname');
 					$class['class_sno']		=	$this->getExcelValue($objPHPExcel,"B",$i);
 					$class['schoolid']		=	session('user_auth.schoolid');
 					$class['status']  		=	array('neq','-1');//班级状态（-1：已删除，0：禁用，1：正常）
 					$class['undergraduate']	=   1;//是否毕业（1，表示未毕业，0表示已毕业）
 					$class_data				=	$classModel->field('id,studentcount')->where($class)->find();
 					if ($class_data) {
 						
 						$classSet['studentcount']=	$class_data['studentcount']+1;
 						$classModel->where($class)->save($classSet);
 					}else {//班级不存在回滚事务，提示错误。
 						$classModel->rollback();
 						$this->error('第'.$i.'行：班级不存在！','',30);
 					}
 					$student['classid']		=	$class_data['id'];
 					$student['cardid']     	=	$this->getExcelValue($objPHPExcel,"C",$i);
 					$student['username']   	=	$this->getExcelValue($objPHPExcel,"D",$i);
 					$student['sex']        	=	$this->getExcelValue($objPHPExcel,"E",$i);
 					$student['birthday']   	=	$this->getExcelValue($objPHPExcel,"F",$i);
 					$student['national']   	=	$this->getExcelValue($objPHPExcel,"G",$i);
//                  $student['city']
 					$student['picture']		=	'/public/images/icon.jpg';
 					$student['actual_residence']	=	$this->getExcelValue($objPHPExcel,"M",$i);
 					$student['parent_name']	=	$this->getExcelValue($objPHPExcel,"N",$i);
 					$student['parent_tel']	=	$this->getExcelValue($objPHPExcel,"O",$i);
 					$student['park']		=	$this->getExcelValue($objPHPExcel,"P",$i);
 					$student['status']		=	1;//学生状态:（-1：已删除，0：禁用，1：正常）
	 				$student['isstudy']		=	1;//在读状态:（1表示在读，2表示毕业，3表示退学，默认为1）
 					if (!$studentModel->create($student)){     // 如果创建失败 表示验证没有通过 输出错误提示信息
 						$classModel->rollback();
 						$this->error('第'.$i.'行：'.$studentModel->getError(),'',30);
 					}else{     // 验证通过 可以进行其他数据操作
 						if(!$studentModel->add($student)){
 							$classModel->rollback();
 							$this->error('第'.$i.'行：添加失败！','',30);
 						}
 					}
 				}
 			}
 			$classModel->commit();
 			$this->success('导入成功！',Cookie('__forward__'));
 		}else{
 			$this->display();
 		}
 	}
}